﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using ComunesMGI.DataTypes;
using ClienteWinMGI.Presentacion;

namespace ClienteWinMGI.AccesoDatos
{
    class CtrMGIIncidentes:IMGIIncidentes
    {
        #region IMGIIncidentes Members


        /// <summary>
        /// Devuelve una lista con los datos de los incidentes que pertenecen al sistema del cliente
        /// </summary>
        /// <param name="cliente">contiene la informacion del cliente</param>
        /// <param name="sistema">contiene la informacion del sistema</param>
        /// <returns>Coleccion con los datos de los incidentes.</returns>
        public List<DataIncidente> getIncidentes(DataCliente cliente, DataSistema sistema)
        {
            MGIIncidentesWS.MGIIncidentesWSClient ws = new MGIIncidentesWS.MGIIncidentesWSClient();
            ws.Open();
            List<DataIncidente> ret = ws.getIncidentes(cliente, sistema);
            ws.Close();
            return ret;
         }


        /// <summary>
        /// Devuelve una coleccion con la informacion de las tareas para el sistema del cliente
        /// </summary>
        /// <param name="cliente">contiene la informacion del cliente</param>
        /// <param name="sistema">contiene la informacion del sistema</param>
        /// <returns>lista de DataTarea</returns>
        public List<DataTarea> getTareas(DataCliente cliente, DataSistema sistema, DataIncidente incidente)
        {
            MGIIncidentesWS.MGIIncidentesWSClient ws = new MGIIncidentesWS.MGIIncidentesWSClient();
            ws.Open();
            List<DataTarea> ret = ws.getTareas(cliente, sistema, incidente);
            ws.Close();
            return ret;
        }

        public List<DataCampo> getCampos(DataCliente cliente, DataSistema sistema)
        {
            MGIIncidentesWS.MGIIncidentesWSClient ws = new MGIIncidentesWS.MGIIncidentesWSClient();
            ws.Open();
            List<DataCampo> ret = ws.getCampos(cliente, sistema);
            ws.Close();
            return ret;
        }

        /// <summary>
        /// Asigna como responsable al usuario "usuario" de la tarea "tarea" del incidente "incidente"
        /// </summary>
        /// <param name="incidente">datos del incidente</param>
        /// <param name="tarea">datos de la tarea</param>
        /// <param name="usuario">datos del usuario</param>
        /// <returns></returns>
        public bool asignarResposable(DataSistema sistema, DataIncidente incidente, DataTarea tarea, DataUsuario usuario)
        {
            MGIIncidentesWS.MGIIncidentesWSClient ws = new MGIIncidentesWS.MGIIncidentesWSClient();
            ws.Open();
            bool ret = ws.asignarResponsable(sistema, incidente, tarea, usuario);
            ws.Close();
            return ret;
        }

        public DataAltaIncidente addIncidente(DataSistema incidente, List <DataAttachment> archivos)
        {
            MGIIncidentesWS.MGIIncidentesWSClient ws = new MGIIncidentesWS.MGIIncidentesWSClient();
            ws.Open();
            DataAltaIncidente ret = ws.addIncidente(incidente, archivos);
            ws.Close();
            return ret;
        }


        public void addWorkPackage(DataCliente cliente, DataSistema sistema, DataWP datosWp)
        {
            MGIIncidentesWS.MGIIncidentesWSClient ws = new MGIIncidentesWS.MGIIncidentesWSClient();
            ws.Open();
            ws.addWorkPackage(cliente, sistema, datosWp);
            ws.Close();
            
        }


        public List<DataWP> getWorkPackages(DataCliente cliente, DataSistema sistema)
        {
            MGIIncidentesWS.MGIIncidentesWSClient ws = new MGIIncidentesWS.MGIIncidentesWSClient();
            ws.Open();
            List<DataWP> ret = ws.getWorkPackages(cliente, sistema);
            ws.Close();
            return ret;
        }

        public void asociarIncidentesWP(DataCliente cliente, DataSistema sistema,DataWP wp, List<DataIncidente> incidentes) {
            MGIIncidentesWS.MGIIncidentesWSClient ws = new MGIIncidentesWS.MGIIncidentesWSClient();
            ws.Open();
            ws.asociarIncidenteWP(cliente, sistema, wp, incidentes);
            ws.Close();
          
            
        }

        /// <summary>
        /// Obtiene todos los incidentes cerrados en el sistema de un cliente en un periodo 
        /// </summary>
        /// <param name="cliente">datos del cliente</param>
        /// <param name="sistema">datos del sistema</param>
        /// <param name="fechaDesde">fecha inicio del periodo</param>
        /// <param name="fechaHasta">fecha fin del periodo</param>
        /// <returns></returns>
        public List<DataIncidenteReporte> getIncidentesCerradosPeriodo(List<DataSistema> sistemas, DateTime fechaDesde, DateTime fechaHasta) 
        {
            try
            {
                MGIIncidentesWS.MGIIncidentesWSClient ws = new MGIIncidentesWS.MGIIncidentesWSClient();
                ws.Open();
                List<DataIncidenteReporte> ret = ws.getIncidentesCerradosPeriodo( sistemas, fechaDesde, fechaHasta);
                ws.Close();
                return ret;
            }
            catch (Exception e) {
                Error err = new Error("Error", "No se han podido obtener los incidentes cerrados", e.Message.ToString());
                return null;
            }
        }



        /// <summary>
        /// devuelve la lista con los datos de los incidentes que tiene asociado un determinado work package
        /// </summary>
        /// <param name="sistema"></param>
        /// <param name="wp"></param>
        /// <returns>lista de dataIncidente</returns>
        public List<DataIncidente> getIncidentesWP(DataSistema sistema, DataWP wp)
        {
            MGIIncidentesWS.MGIIncidentesWSClient ws = new MGIIncidentesWS.MGIIncidentesWSClient();
            ws.Open();
            List<DataIncidente> lista=ws.getIncidentesWP(sistema,wp);
            ws.Close();
            return lista;
        }
        #endregion
    }
}
